package com.cy.store.mapper;

import com.cy.store.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.Date;
import java.util.List;

/**
 * 用户模块的持久化层接口
 */
@Mapper
public interface UserMapper {
    /**
     * 插入用户的数据->用来实现注册功能
     * @param user
     * @return 受到影响的行数(增删改查 )
     */
    Integer insert(User user);

    /**
     * 根据用户名查询用户的数据  or 登录时根据用户名进行第一查询
     * @param username
     * @return  如果找到了则返回相对应的用户信息，找不到返回null
     */
    User findByUsername(String username);

    /**
     * 根据用户的uid来修改用户的密码
     * @param uid
     * @param password
     * @param modifiedUser
     * @param modifiedTime
     * @return  返回影响的行数
     */
    Integer updatepasswrodByUid(@Param("uid") Integer uid,
                                @Param("password") String password,
                                @Param("modifiedUser") String modifiedUser,
                                @Param("modifiedTime") Date modifiedTime);

    /**
     * 用户个人资料更新时查询用户是否存在以及用户从别的页面点击到 userData.html  时判断此用户的数据是否存在的方法
     * @param uid  此用户的uid   从session中获取
     * @return
     */
    User findByUid(Integer uid);

    /**
     * 此方法主要是为了用户点击修改个人资料的按钮以后执行的更新数据库的数据的方法
     * @param user
     * @return
     */
    Integer updateInfoByUid(User user);

    /**
     *
     * @param uid
     * @param avatar
     * @param modifiedUser
     * @param modifiedTime
     * @return
     *
     * @param ("sql映射文件中#{}占位符的变量名"):解决问题：当sql语句的占位符和映射的接口方法参数不一致是，需要将某个参数强行注入到某个占位符变量上时，可以使用@param这个注解来标注映射的关系。
     */
    Integer updateAvatarByUid(@Param("uid") Integer uid,
                              @Param("avatar") String avatar,
                              @Param("modifiedUser") String modifiedUser,
                              @Param("modifiedTime") Date modifiedTime);


    /**
     * 激活之前的查询
     * @param confirmCode
     * @return
     */
    @Select("select email,activation_time from t_user where confirm_code =#{confirmCode}")
    User selectUserByConfirmCode(@Param("confirmCode") String confirmCode);

    /**
     * 激活账号
     * @param confirmCode
     * @return
     */
    @Update("update t_user set is_valid = 1 where confirm_code =#{confirmCode}")
    int  updateUserByConfirmCode(@Param("confirmCode") String confirmCode);

//    @Select("select email,password,salt from t_user where email=#{email} and is_valid= 1")
//    User selectUserByEmail(@Param("email") String email);

}
